iT邦幫忙

2023 iThome 鐵人賽

DAY 7
1
Software Development

30天冒險之旅: 資料結構與演算法筆記挑戰系列 第 7

資料結構 — 鏈結串列(Linked List)Leetcode實戰

  • 分享至 

  • xImage
  •  

相信大家學完LinkList之後都想實際練習一下,我們再來透過Medium題目挑戰自己吧!/images/emoticon/emoticon08.gif
今天有點趕,先放上兩篇,希望有機會能再多放一題!


24. Swap Nodes in Pairs

程度

Medium

題目

交換每兩個相鄰節點並返回

想法

首先,我們會在鍊錶的最前面添加一個假的節點,讓這個假節點的下一個指向原始的頭節點,這樣我們可以更好地處理交換操作。
https://ithelp.ithome.com.tw/upload/images/20230922/20162567PKFcwoVmjm.png
接下來,我們需要使用三個指標來幫助我們進行交換。這三個指標分別是:

  • 第一個指標是用來指向前一個節點的,以便連接新的節點。
  • 二個和第三個指標則是我們要進行交換的兩個節點。

最後,我們要按照順序來移動這些指標,確保交換順利進行。

交換的時刻到了

為了確保我們不會丟失指向下一個節點的連接,我們需要按照這樣的順序進行:

  1. 讓第一個指標指向第三個節點,這樣它就不會丟失連接。
  2. 我們要讓第二個指標指向第三個節點後面的那個節點。
  3. 讓第三個節點指向第二個節點。

這樣就完成一次交換了
https://ithelp.ithome.com.tw/upload/images/20230922/20162567X6dnRcnfhv.png
最後就是移動指標到下一次位置
https://ithelp.ithome.com.tw/upload/images/20230922/20162567XUFiDQEY0y.png

完整程式碼

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        ListNode *prenode;
        ListNode *n1,*n2;
      if(head == nullptr || head->next == nullptr)
          return head;
      ListNode *node = new ListNode();
      node->next = head;
      prenode = node;
      n1 = prenode->next;
      n2 = n1->next;
      while( n1 != nullptr && n2 != nullptr){
          prenode->next = n2;
          n1->next = n2->next;
          n2->next = n1;
          prenode = n1;
          n1 = prenode->next;
          if(n1 != nullptr && n1->next != nullptr)
              n2 = n1->next;
          else
            break;
      }
        return node->next;        
    }
};


328. Odd Even Linked List

程度

Medium

題目

將一個LinkList 的奇數點連在一起,偶數點連在一起,再將點串在一起

想法

就像在跳格子一樣,我們可以遍歷連結串列,但不是每次都前進一步,而是跳過一個節點,然後將跳過的節點連接起來。這樣,奇數位置的節點和偶數位置的節點就分別連在一起了。

最後,我們只需要將奇數部分和偶數部分的連結串列再連接在一起,就完成了整個操作。

程式碼

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* oddEvenList(ListNode* head) {
        if (head == nullptr|| head->next == nullptr) {
            return head;
        }
        ListNode* even = head->next;
        ListNode *odd = head;
        ListNode *evenHead = even;
        while(even !=nullptr && even->next != nullptr){
            odd->next = even->next;
            odd = odd->next;
            even->next = odd->next;
            even = even->next; 
        }
        odd->next = evenHead;
        return head;        
    }
};

明天會開始進入下一個單元拉! 有什麼更好的解法也歡迎大家來留言喔~~


上一篇
資料結構 — 環狀鏈結串列(Circular Link List)
下一篇
資料結構 — 堆疊(Stack)介紹
系列文
30天冒險之旅: 資料結構與演算法筆記挑戰30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言